import 'dart:mirrors';

@Todo('todo1', 'A')
class A {
  @Todo('todo2', 'a')
  int a;

  A(this.a) {
    print(a);
  }

  @Todo('todo3', 'doA')
  doA(@Todo('todo4', 'x') int x) {}
}

class Todo {
  final String who;
  final String what;

  const Todo(this.who, this.what);
}

main(List<String> args) {
  getAnnotation();
}

void getAnnotation() {
  ClassMirror classMirror = reflectClass(A);

  // 1.获取 class 上的元数据
  classMirror.metadata.forEach((metadata) {
    //因为示例就一个元数据，后续就省略判断了
    if (metadata.reflectee is Todo) {
      print(metadata.reflectee.who + ' ==> ' + metadata.reflectee.what);
    }
  });

  //declarations,获取A类所有的方法和属性（没有继承）
  classMirror.declarations.forEach((Symbol key, DeclarationMirror value) {
    //属性是VariableMirror
    if (value is VariableMirror) {
      // 2.属性上的元数据
      value.metadata.forEach((metadata) {
        print(metadata.reflectee.who + ' ==> ' + metadata.reflectee.what);
      });
    }

    if (value is MethodMirror) {
      // 3.方法上的元数据
      value.metadata.forEach((metadata) {
        print(metadata.reflectee.who + ' ==> ' + metadata.reflectee.what);
      });
      // 方法里的参数列表
      value.parameters.forEach((param) {
        //4.方法里参数的元数据
        param.metadata.forEach((metadata) {
          print(metadata.reflectee.who + ' ==> ' + metadata.reflectee.what);
        });
      });
    }
  });
}
